package com.bmps.springcloud.insuredmicroservice.service;

import com.bmps.springcloud.insuredmicroservice.model.accept.resquest.AppntModel;
import com.bmps.springcloud.insuredmicroservice.model.accept.resquest.InsurantModel;
import com.bmps.springcloud.insuredmicroservice.model.trail.TrialPersonModel;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @author lyw
 * @date 2019/9/3 10:53
 */
public interface RedisService {
    /**
     * 获取指定key对应的value
     *
     * @param key 键值
     * @return Object
     */
    Object get(String key);

    /**
     * 获取指定key对应value值
     *
     * @param key 键值
     * @return Set
     * @throws Exception 异常
     */
    Set<?> members(String key) throws Exception;

    /**
     * 设置key对应的value的超时时间
     *
     * @param key       键值
     * @param value     value值
     * @param outOfTime 时间
     * @param timeUnit  单位
     */
    void set(String key, String value, long outOfTime, TimeUnit timeUnit);

    /**
     * 判断是否是主险
     *
     * @param riskCode 险种编码
     * @return boolean
     */
    boolean isMainRisk(String riskCode);

    /**
     * 获取缓存中可能存在的保额
     *
     * @param sort          类别 A-重疾 B-豁免 C-住院 D-未成年人死亡责任 E-交通意外
     * @param ID            证件号
     * @param currentAmount 当前单累积保额
     * @param contNo        保单号
     * @return 缓存中保额
     */
    BigDecimal getCacheQuota(String sort, String ID, BigDecimal currentAmount, String contNo);

    /**
     * 模糊删除
     *
     * @param key
     */
    void delDim(String key);

    /**
     * @param type        类别
     * @param planVersion 计划版本
     * @param id          证件号
     * @param mult        份数
     * @param contNo      保单号
     * @return 缓存中的份数
     */
    Integer getCacheMult(String type, Integer planVersion, String id, Integer mult, String contNo);

    /**
     * 校验产品是否是豁免险
     *
     * @param riskCode 险种
     * @return boolean
     */
    boolean exemptionProduct(String riskCode);

    /**
     * 判断险种存在责任
     *
     * @param riskCode      险种
     * @param appntModel    投保人
     * @param insurantModel 被保人
     * @param polApplyDate  申请日
     * @return true-有豁免责任
     */
    boolean isExemptDuty(String riskCode, AppntModel appntModel, InsurantModel insurantModel, Date polApplyDate);

    /**
     * 获取缓存的计算要素
     *
     * @param trialPersonModel trialPersonModel
     * @param mode             G-保额算保费、P-保费算保额
     * @return trialPersonModel
     */
    TrialPersonModel getCalculateMode(TrialPersonModel trialPersonModel, String mode);

    /**
     * 获取缓存的计算要素
     * 支持同一险种多个计算 2020-06-30 以后的产品放弃getCalculateMode 使用 本方法计算
     *
     * @param trialPersonModel trialPersonModel
     * @param mode             G-保额算保费、P-保费算保额
     * @return trialPersonModel
     */
    TrialPersonModel getCalculateModeNew(TrialPersonModel trialPersonModel, String mode);

    /**
     * 获取缓存的计算要素
     *
     * @param trialPersonModel trialPersonModel
     * @param mode             A-加费
     * @return trialPersonModel
     */
    TrialPersonModel getCalculateModeComplex(TrialPersonModel trialPersonModel, String mode);

    /**
     * 获取缓存中的城市级别：一线城市、二线城市
     *
     * @param city 城市编码
     * @return 1或2
     */
    Integer getCity(String city);

    /**
     * 判断集合中是否存在value
     *
     * @param key   键
     * @param value 值
     * @return boolean
     */
    boolean isMember(String key, String value);

    /**
     * 产品是否调用保盾云
     * @param agencyCode 机构
     * @param riskCode 险种
     * @return true-调用
     */
    boolean isCloud(String agencyCode, String riskCode);
}
